【Terraform】Google Cloud Storage バケットのIAM管理:3つの異なる粒度(policy, binding, member)でのポリシー設定方法と使い分けの解説
概要
今回は以下のTerraformの公式サイトからの情報をアウトプットしていきます。
自身で調べていても、少しわかりにくかったので理解のためのTipsとして使用いただければ幸いです。
3つの範囲でポリシーを指定する
バケットのIAMポリシー全体を設定
data "google_iam_policy" "admin" {
binding {
role = "roles/storage.admin"
members = [
"user:jane@example.com",
]
}
}
resource "google_storage_bucket_iam_policy" "policy" {
bucket = google_storage_bucket.default.name
policy_data = data.google_iam_policy.admin.policy_data
}
data google_iam_policy adminの部分は、dataブロックを利用して、IAMポリシーを定義しています。このブロックは、実際にリソースを作成するのではなく、設定を記述するためのものです。
- google_iam_policy
- タイプのデータソースを使って、IAMポリシーの内容を記述します。
- admin
- このデータソースにつけた名前で、後で参照するために使います。
- binding
- このブロックの中で、実際の権限設定を行います。
- role = roles/storage.adminは、ストレージ管理者の役割を指定しています。
- members = user:jane@example.comには、この役割を与えるユーザーを列挙します。
resource google_storage_bucket_iam_policy policyの部分は、通常のようにTerraformでリソースを定義する箇所となります。
- bucket
- 対象のバケット(google_storage_bucket.default.name)を指定します。
- policy_data
- 先程作成したポリシー(data.google_iam_policy.admin.policy_data)を指定します。
コードにするとわかりずらいですが、ポリシーを作成→バケットに適応というGoogle Cloud コンソールと同じような操作だと考えていいと思います。(よって最も大きな粒度でのポリシーの変更となります)
特定のプリンシパルに対して権限を付与
resource "google_storage_bucket_iam_binding" "binding" {
bucket = google_storage_bucket.default.name
role = "roles/storage.admin"
members = [
"user:jane@example.com",
]
}
resource google_storage_bucket_iam_binding bindingの部分は、通常のようにTerraformでリソースを定義する箇所となります。このリソースは、特定のロールに対するメンバーリストを管理します。
- bucket
- 対象のバケット(google_storage_bucket.default.name)を指定します。
- role
- 設定するロール(roles/storage.admin)を指定します。この例ではストレージ管理者の役割を設定しています。
- members
- このロールを与えるメンバーのリストを指定します。(user:jane@example.comを指定)
このリソースは、指定されたバケットのポリシーにおいて、特定のロール(この場合はストレージ管理者)に対するメンバーリストを更新します。
既存のメンバーリストは、ここで指定されたリストに置き換えられますが、他のロールに関するポリシー設定は影響を受けません。
先程はポリシー自体を変更しましたが、今回は特定のロールに対するメンバーリストを更新するという操作だと考えていいと思います。(よって中間的な粒度でのポリシーの変更となります)
特定の役割(ロール)に新しいメンバーを追加
resource "google_storage_bucket_iam_member" "member" {
bucket = google_storage_bucket.default.name
role = "roles/storage.admin"
member = "user:jane@example.com"
}
resource google_storage_bucket_iam_member memberの部分は、通常のようにTerraformでリソースを定義する箇所となります。このリソースは、特定のロールに対して単一のメンバーを追加します。
- bucket
- 対象のバケット(google_storage_bucket.default.name)を指定します。
- role
- 設定するロール(roles/storage.admin)を指定します。この例ではストレージ管理者の役割を設定しています。
- member
- このロールを与える単一のメンバーを指定します。(user:jane@example.comを指定)
このリソースは、指定されたバケットのポリシーにおいて、特定のロール(この場合はストレージ管理者)に対して新しいメンバーを追加します。既存のメンバーや他のロールに関するポリシー設定は影響を受けません。
先程はメンバーリストを更新しましたが、今回は特定のロールに対して単一のメンバーを追加するという操作だと考えていいと思います。(よって最も細かい粒度でのポリシーの変更となります)
まとめ
今回は結構ニッチな話になりましたが、IAMポリシーの仕組みを理解していても、コードになった途端依存関係がわからなくなることがあるので、解説しました。(私はわかりづらかった)
今回紹介した3つのIAMポリシー管理リソースは、それぞれ異なる粒度でポリシーを制御できるため、状況に応じて適切なものを選択することが重要かと思います。
全体的なポリシー管理が必要な場合はpolicyを、特定のロールに対するメンバーリストを管理する場合はbindingを、個別のメンバー追加にはmemberを使用すると適切な運用となります。
Googleのベストプラクティスに則って、最小権限の原則を適応させるよう意識していきます。